package Classroom.A0510.PolyPra;

/**多态：多种形态
 *    实现前提：
 *        继承、重写、向上转型    默认只能调用子类重写父类的方法，子类独有的不能使用
 *    转型：
 *      向上转型：  子类对象  赋值  父类的引用变量   系统自动   int ---> long
 *      向下转型：  父类对象  赋值   子类的引用变量  强制转换   long ---> int
 *              容易出现转换异常    谨慎使用     先检查后使用
 */
public class Test {
    public static void main(String[] args) {
        //多态
        Car car;
        car = new Car();
        car.speedUp();
        //向上转型   将子类的对象  赋值 给 父类的引用变量   系统自动提供的
        car = new Bus();
        car.speedUp();
        //只能使用  共有  重写的方法，子类独有的属性以及方法不能被使用
//        car.speedDown();
        car = new Pick();
        car.speedUp();
    }
}

//父类
class Car{

    double speed = 50;

    void speedUp(){
        speed += 10;
    }
}

//子类
class Bus extends Car{
    @Override
    void speedUp() {
        speed += 5;
    }

    void speedDown(){
        speed -= 10;
    }
}

class Pick extends Car{
    @Override
    void speedUp() {
        speed += 8;
    }
}

//对汽车的操作类
class CarOpe{

    //操作方法    声明一个父类类型的引用变量作为形参
    //调用时，可以根据需要赋予不同的对象
    void opeCar2(Car car){
        car.speedUp();
        System.out.println(car.speed);
    }

    public static void main(String[] args) {
        CarOpe carOpe = new CarOpe();
//        Car car = new Bus();
        carOpe.opeCar2(new Pick());
    }
}
